/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Loreno
 */
public class cmdCondicional {

    public boolean comandoCondicional(TabelaSimbolos tabelasimbolos) {

        if(tabelasimbolos.getLookahead().equals("if"))
            tabelasimbolos.insertEscopo();
        if (tabelasimbolos.reconhecer("if")) {
            if (testeIf(tabelasimbolos)) {
                if (tabelasimbolos.getLookahead().equals("else")) {
                    tabelasimbolos.reconhecer("else");
                    if (tabelasimbolos.getLookahead().equals("if")) {
                        return true;
                    } else {
                        if (tabelasimbolos.reconhecer("{")) {
                            if (miolo(tabelasimbolos)) {
                                if (tabelasimbolos.reconhecer("}")) {
                                    return true;
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }
                            } else {
                                return false;
                            }
                        } else if (miolo2(tabelasimbolos)) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                } else {
                    return true;
                }
            } else {
                return false;
            }
        } else {

            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
            TabelaErros.getInstance().getTabelaErros().add(erro);
            return false;
        }

    }

    private boolean testeIf(TabelaSimbolos tabelasimbolos) {

        if (tabelasimbolos.reconhecer("(")) {
            if (tabelasimbolos.getTipo().equals("identificador")) {
                if (ExpressaoLogica.expLogica(tabelasimbolos)) {
                    if (tabelasimbolos.reconhecer(")")) {
                        if (tabelasimbolos.reconhecer("{")) {
                            if (miolo(tabelasimbolos)) {
                                if (tabelasimbolos.reconhecer("}")) {
                                    return true;
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }
                            } else {
                                return false;
                            }
                        } else if (miolo2(tabelasimbolos)) {
                            return true;
                        } else {
                            return false;
                        }
                    } else {

                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                        TabelaErros.getInstance().getTabelaErros().add(erro);
                        return false;
                    }
                } else {
                    return false;
                }
            } else if (tabelasimbolos.getLookahead().equals("true") || tabelasimbolos.getLookahead().equals("false")) {
                if (tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())) {
                    if (tabelasimbolos.reconhecer(")")) {
                        if (tabelasimbolos.reconhecer("{")) {
                            if (miolo(tabelasimbolos)) {
                                if (tabelasimbolos.reconhecer("}")) {
                                    return true;
                                } else {

                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                                    TabelaErros.getInstance().getTabelaErros().add(erro);
                                    return false;
                                }
                            } else {
                                return false;
                            }
                        } else if (miolo2(tabelasimbolos)) {
                            return true;
                        } else {
                            return false;
                        }
                    } else {

                        ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                        TabelaErros.getInstance().getTabelaErros().add(erro);
                        return false;
                    }
                } else {

                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
                    TabelaErros.getInstance().getTabelaErros().add(erro);
                    return false;
                }
            } else {
                return false;
            }
        } else {

            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha());
            TabelaErros.getInstance().getTabelaErros().add(erro);
            return false;
        }
    }

    private boolean miolo(TabelaSimbolos tabelasimbolos) {

        chamadaDeFuncao cf = new chamadaDeFuncao(tabelasimbolos);
        ExpAtribuicao ea = new ExpAtribuicao();
        entradaDeDados ed = new entradaDeDados();
        saidaNaTela st = new saidaNaTela();
        cmdRepeticao cr = new cmdRepeticao();

        while (!tabelasimbolos.getLookahead().equals("}")) {
            System.out.println("miolo: " + tabelasimbolos.getLookahead());
            if (tabelasimbolos.getTipo().equals("identificador")) {
                if (tabelasimbolos.superLookahead(1).equals("(")) {
                    if (cf.chamaFuncao()); else {
                        return false;
                    }
                } else if (tabelasimbolos.superLookahead(1).equals("++") || tabelasimbolos.superLookahead(1).equals("--") || tabelasimbolos.superLookahead(1).equals("=")) {
                    if (ea.expatribuicao(tabelasimbolos)); else {
                        return false;
                    }
                } else {
                    return false;
                }
            } else if (tabelasimbolos.getLookahead().equals("*")) {
                if (ea.expatribuicao(tabelasimbolos)); else {
                    return false;
                }
            } else if (tabelasimbolos.getLookahead().equals("scanf")) {
                if (ed.entradadados(tabelasimbolos)); else {
                    return false;
                }
            } else if (tabelasimbolos.getLookahead().equals("printf")) {
                if (st.saidaTela(tabelasimbolos)); else {
                    return false;
                }
            } else if (tabelasimbolos.getLookahead().equals("if")) {
                if (comandoCondicional(tabelasimbolos)); else {
                    return false;
                }
            } else if (tabelasimbolos.getLookahead().equals("while") || tabelasimbolos.getLookahead().equals("do") || tabelasimbolos.getLookahead().equals("for")) {
                if (cr.comandoRepeticao(tabelasimbolos)); else {
                    return false;
                }
            } else {
                return false;
            }
        }
        return true;
    }

    private boolean miolo2(TabelaSimbolos tabelasimbolos) {

        chamadaDeFuncao cf = new chamadaDeFuncao(tabelasimbolos);
        ExpAtribuicao ea = new ExpAtribuicao();
        entradaDeDados ed = new entradaDeDados();
        saidaNaTela st = new saidaNaTela();
        cmdRepeticao cr = new cmdRepeticao();

        if (tabelasimbolos.getLookahead().equals("identificador")) {
            if (tabelasimbolos.superLookahead(1).equals("(")) {
                if (cf.chamaFuncao()) {
                    return true;
                } else {
                    return false;
                }
            } else if (tabelasimbolos.superLookahead(1).equals("++") || tabelasimbolos.superLookahead(1).equals("--") || tabelasimbolos.superLookahead(1).equals("=")) {
                if (ea.expatribuicao(tabelasimbolos)) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (tabelasimbolos.getLookahead().equals("*")) {
            if (ea.expatribuicao(tabelasimbolos)) {
                return true;
            } else {
                return false;
            }
        } else if (tabelasimbolos.getLookahead().equals("scanf")) {
            if (ed.entradadados(tabelasimbolos)) {
                return true;
            } else {
                return false;
            }
        } else if (tabelasimbolos.getLookahead().equals("printf")) {
            if (st.saidaTela(tabelasimbolos)) {
                return true;
            } else {
                return false;
            }
        } else if (tabelasimbolos.getLookahead().equals("if")) {
            if (comandoCondicional(tabelasimbolos)) {
                return true;
            } else {
                return false;
            }
        } else if (tabelasimbolos.getLookahead().equals("while") || tabelasimbolos.getLookahead().equals("do") || tabelasimbolos.getLookahead().equals("for")) {
            if (cr.comandoRepeticao(tabelasimbolos)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}
